home *** CD-ROM | disk | FTP | other *** search
/ Aminet 4 / Aminet 4 - November 1994.iso / aminet / dev / misc / thesource7.lha / Utilities / PhxAss_3.71.lha / phxass.doc < prev   
Text File  |  1994-04-29  |  42KB  |  1,219 lines

  1. last change: 94-01-14
  2.  
  3.              ********************************
  4.              *                    *
  5.              *       P h x A s s      V 3.xx    *
  6.              *                    *
  7.              *        MC680x0/68851/6888x     *
  8.              *          Macro Assembler        *
  9.              *                    *
  10.              *      Written by Frank Wille    *
  11.              *                    *
  12.              ********************************
  13.  
  14.  
  15.  
  16. Contents
  17. ========
  18.  
  19. o Preface
  20.  
  21. o Modifications
  22.  
  23. o Bug fixes since V2.11
  24.  
  25. o Bug fixes since V3.00
  26.  
  27. o Starting PhxAss
  28.  
  29. o Assembler Options
  30.  
  31. o Programmer Information
  32.  
  33. o Linker
  34.  
  35. o Assembler Errors
  36.  
  37. o History
  38.  
  39. o Bugs
  40.  
  41.  
  42.  
  43.  
  44. Preface
  45. =======
  46.  
  47. PhxAss V3.xx is SHAREWARE and © copyright 1993 by Frank Wille. Commercial
  48. usage of this program, without a written permission of the author, is strictly
  49. forbidden!
  50.  
  51. PhxAss V3.xx supports all instructions and addressing modes of the following
  52. Motorola processors:  68000,68010,68020,68030,68040,68851,68881,68882
  53. I have completely rewritten huge parts of the source-code, e.g. the whole
  54. addressing mode recognition and the specific code for all instructions.
  55. Because of new searching algorithms the assembling is 15-45% (!) faster as
  56. with version V2.x. On my 7 MHz 68010 A1000 I have measured nearly 25000
  57. lines per minute.
  58. This program is SHAREWARE. So if you like it, please send me 25 DM or 15$ to
  59. become a registered user. In return you will get the latest updates.
  60.  
  61.  
  62.  
  63. Modifications to PhxAss V2.xx
  64. =============================
  65.  
  66. Register symbols (EQUR) must be declared before they are used. This enables a
  67. faster addressing mode recognition.
  68.  
  69. There are some new optimizations possible. The optimize-flags which can be
  70. specified after the -n option or after the OPT directive have completely
  71. changed (see "Assembler Options").
  72.  
  73. If you have enabled the small-code model, all jumps which are referencing
  74. external symbols are converted to PC-relative instead of long branch.
  75.  
  76. The '*'-symbol contains the current address. For example a 'bra *+10' would
  77. branch to the location 12 bytes behind the 'bra'-opcode.
  78.  
  79. New directives: FPU, PMMU, CODE_C, CODE_F, DATA_C, DATA_F, BSS_C, BSS_F and
  80. INCDIR.
  81.  
  82. Already mentioned above: The instructions and addressing modes of 68020-68040,
  83. 68851(PMMU) and 6888x(FPCP) are completely supported. You can use Motorola's
  84. new addressing mode style even in the 68000 mode (e.g. MOVE (4,A5),D0 ).
  85.  
  86. The new addressing mode recognition has no difficulties with parentheses '()'
  87. instead of brackets '[]' to indicate a term. An operand like
  88.  
  89.  -([x|y]*z)+6([addr+2,A4,regxy*QSIZE],[outerdisp+$100<<(1+3)]),((abc-xyz)+2,A3)
  90.  
  91. would cause no problems.
  92.  
  93. PhxAss enables floating-point numbers to be used with the 6888x (FPCP)
  94. instructions. For example:     fmove.d  #3.1415926536,fp7
  95. moves the double-precision number pi to the FPCP register seven.
  96.  
  97. Note: Ensure that your LIBS: directory contains the 'mathieeedoubbas.library'.
  98.  
  99. Since V3.10 PhxAss is able to optimize forward-branches, which are coming
  100. into their 8/16-bit range by optimzation of the subsequent code. As a result,
  101. other forward-branches could come into range and are also optimized, and so
  102. on.
  103.  
  104. V3.30:
  105. o Symbols which are preceded by a '.' will be regarded as local symbols too.
  106. o A special version of PhxAss is available, which is not limited to the
  107.   maximum number of 65535 lines.
  108.  
  109. V3.40:
  110. o Macro parameters may contain 63 characters now.
  111. o The extended addressing mode recognition accepts the register symbols
  112.   ZD0-ZD7 and ZA0-ZA7 to specify a suppressed register.
  113. o Two new escape codes available:
  114.   \e = escape ($1b)  and  \c = control sequence introducer ($9b).
  115.  
  116. V3.42:
  117. o Float constants may be replaced by hex-constants now.
  118. o When branch-optimization is activated, no extension-checking takes place.
  119.   The best-possible code will be generated.
  120.  
  121. V3.47
  122. o New optimization-flag: 'I' forces PhxAss to ignore a 'Too large distance'
  123.   error.
  124.  
  125. V3.50
  126. o '@' is allowed to be the first character of a symbol name, providing the
  127.   second character is non-numeric.
  128. o The RORG directive is implemented.
  129. o Two Devpac-specific directives are also supported now:
  130.   RSRESET and RS.x for faster reading of (Devpac) include files.
  131. o The new option '-c' can be used to switch off the case-sensitivity.
  132.  
  133. V3.51
  134. o RSSET was forgotten in V3.50
  135. o New directives: IDNT, COMMENT, SUBTTL
  136.  
  137. V3.55
  138. o From now on near-data symbols can be accessed not only by Absolute Addressing
  139.   but also by Address Register Indirect mode ( (An) must be the correct near-
  140.   data base register). This will make the assembling of your source much
  141.   faster, because PhxAss has to do less optimizations. As a side effect XREFs
  142.   will be interpreted correctly and must not be replaced by NREFs.
  143. o If no unit name is given (by TTL or IDNT), PhxAss will use the name of the
  144.   source code without extension as the default unit name.
  145. o The OFFSET directive is supported.
  146.  
  147. V3.60
  148. o PhxAss V3.60 is pure! You can use the CLI-command RESIDENT to add it to the
  149.   resident list.
  150.  
  151. V3.70
  152. o '.W' and '.L' displacement-extensions for explicitely activating the 68020
  153.   base-displacement mode.
  154.  
  155. V3.71
  156. o PROCSTART/PROCEND directives for compatibility with DICE-C.
  157.  
  158.  
  159.  
  160. Bug fixes since V2.11
  161. =====================
  162.  
  163. o Some instructions had generated a wrong error, e.g. TRAP and STOP generated
  164.   'Assembly aborted' instead of 'Out of range'.
  165. o 'move.l  #xxxx,-(a0)' produced an illegal opcode.
  166. o If someone writes a program without first opening a section with CODE/CSEG,
  167.   SECTION or an initial label, all labels got wrong values.
  168. o In some cases the equates file let PhxAss crash.
  169. o A XDEF for a symbol which was already declared in another section would
  170.   add this symbol to the external-hunk of the section currently active.
  171. o Jump to Branch optimization did not check the addressing mode of the
  172.   JMP/JSR instruction. It simply optimized all modes.
  173. o A long branch to the next instruction was incorrectly optimized to $6x00.
  174. o Bcc.B was not recognized as a short branch. PhxAss accepted only Bcc.S.
  175. o The CNOP directive had disabled all optimizing in its section.
  176. o The 'Word at odd address'-error crashed PhxAss sometimes.
  177. o INITNEAR was useless in the absolute mode.
  178.  
  179. Bug fixes since V3.00
  180. =====================
  181.  
  182. o TRACKDISK now really works.
  183. o The 68020 addressing-mode ([Rn]) was assembled with a wrong size in pass one.
  184. o The near-data range was incorrectly limited to 32k in object files.
  185. o The formatted text-output should also work on OS2.xx/3.xx now.
  186. o MOVE USP,An , MOVES and MOVEP produced incorrect code.
  187. o GLOBAL and BSS destroyed the MSW-bits of the BSS-hunk type ($000003eb).
  188. o CNOP definitely bug-free (I hope).
  189. o References on "\@"-labels behind another macro nesting were impossible.
  190. o "\@" only allowed 999 macro calls (now it's unlimited).
  191. o Some extended adressing modes had made some problems:
  192.   ([..],Rn.s|*x,od) and ([PC..    got a wrong size in pass one,
  193.   ([BaseDisp])    generated an error and    (bd,An/PC,Xn) (where bd is outside of
  194.   the normal 8-bit range) crashed PhxAss.
  195. o FETOXM1 was forgotten (in my Reference Manual too).
  196. o TAB-Codes within strings could not be expanded.
  197. o Include paths which are suffixed by a ':' (volume names) were not recognized.
  198. o FMOVEM.L Dn,FPcr got four bytes more in pass one than in pass two.
  199. o Starting with page 100 the listing file became unreadable.
  200. o The 'Out of memory' error was useless, because PhxAss crashed in most cases.
  201. o CPUSHL,CINVL,CPUSHP,CINVP didn't work.
  202. o BTST Dn,#x was missing.
  203. o The new formard-branch optimization destroyed the CNOP-alignments, which
  204.   are located between the branch-instruction and the branch-destination.
  205. o NARG was not zero for a macro call without arguments.
  206. o INCLUDE/INCBIN without quotes caused an error.
  207. o IFC '\1','' only behaved reliable if \1 was not used before.
  208. o The 16/32-bit displacements in the PC Indirect with Index addressing mode
  209.   were wrong (+2 Bytes).
  210. o Fixed bugs in AbsLong->AbsShort and Logical Shifts optimization.
  211. o PhxAss tried to optimize CMPI #x,AbsLong always to PC-relative, which caused
  212.   an 'Illegal Addressing Mode' error in 68000/010 mode.
  213.  
  214.  
  215. Starting PhxAss
  216. ===============
  217.  
  218. Start the assembler by entering the command line:
  219.  
  220.    PhxAss [<-options>] <filename> [<-options>]
  221.  
  222. where [<-options>] specify optional parameters and <filename> is the name of
  223. the file to be assembled. If no extension in <filename> is given, the assembler
  224. assumes ".asm" for being the extension. Some options cannot be specified before
  225. the file name (see "Assembler Options").
  226. <filename> must be the name of an assembler source code file. The source code
  227. must be an ASCII text file where each line ends with a linefeed ($0a) character
  228. (the format, which all Amiga editors generate). TAB-codes ($09) are allowed.
  229. When the assembler is running, it can be stopped at any time with CTRL-C.
  230.  
  231.  
  232.  
  233. Assembler Options
  234. =================
  235.  
  236. The following assembler options are supported by PhxAss V3.xx :
  237.  
  238. -o<filename>        Defines the name of the output file. If not specified,
  239.             PhxAss takes the source code's filename and replaces
  240.             its extension by ".o" .
  241.  
  242. -d            The names of all global labels of each section are
  243.             written to symbol data blocks. A debugger can use
  244.             these names instead of addresses.
  245.  
  246. -a            Enable auto-align for DC.x directives. All DC.W, DC.L,
  247.             etc. directives in the code will be automatically
  248.             aligned to word-boundaries.
  249.  
  250. -c            Case-sensitivity off. All symbol names will be con-
  251.             verted to upper case. This will slow down PhxAss by 5%.
  252.  
  253. -s<symname>[=value]    Predefines a symbol by SET directive. If the value is
  254.             missing, the symbol will be set to 1.
  255.  
  256. -e[<filename>]        Generates an equates file. If <filename> is missing,
  257.             the name of the source code with extension ".equ" will
  258.             be used. Cannot be specified before the name of the
  259.             source code.
  260.  
  261. -l[<filename>]        Generates a listing file. If <filename> is missing, the
  262.             name of the source code with extension ".lst" will be
  263.             used. Cannot be specified before the name of the source
  264.             code.
  265.  
  266. -x            Includes a reference list of all global symbols in the
  267.             listing file. If no listing file was opened, this
  268.             option will cause an error.
  269.  
  270. -p[<lines>]        Sets the page length for equates and listing files.
  271.             If <lines> isn't specified or set to zero, no form.
  272.             feed ($0c) characters will be generated. The default
  273.             value is 60 lines.
  274.  
  275. -q            Quiet mode. The assembler makes no outputs until an
  276.             error occurs.
  277.  
  278. -i<path1>[,<path2>..]    Defines one or more include-paths which will be used
  279.             by the INCLUDE and INCBIN directives.
  280.  
  281. -h<name1>[,<name2>..]    Defines one or more INCLUDE directives at the top of
  282.             the source code.
  283.  
  284. -mf            Forces PhxAss to use the large code and large data
  285.             model in all sections. NEAR directives within the
  286.             source code will be ignored.
  287.  
  288. -mn[<areg>][,<secnum>]    Forces all sections to use the small data model.
  289.    or       [,S...]    <areg> (default: 4) specifies the number of the
  290.             address register which will be used as pointer to the
  291.             small data section. Only the registers A2-A6 can be
  292.             used. <secnum> is the number of the section which will
  293.             be your small data section (defaults to -1).
  294.             If <secnum> is -1 or if a string, starting with 'S'
  295.             (e.g. "SmallData"), is specified instead of the
  296.             section number, all Data and Bss sections will be
  297.             treated as a whole small data section. They are
  298.             coalesced by calling the linker with the small data
  299.             option.
  300.  
  301. -mc            Forces the whole code to use the small code model.
  302.             All JSR and JMP instructions which are referencing
  303.             external symbols are converted to PC-relative jumps.
  304.  
  305. -n[<Flags>]        Sets the optimize flags. The following characters can
  306.             be specified after '-n':
  307.  
  308.             N (Normal)
  309.                Standard optimizations:
  310.                clr.l Dn -> moveq #0,Dn,  move.l -> moveq,
  311.                link.l(68020) -> link.w,  adda/suba -> lea
  312.                ($xxxx).L -> ($xx).W,  (0,An) -> (An)
  313.  
  314.             R (Relative)
  315.                ($xxxx) -> (xx,PC)
  316.  
  317.             Q (Quick)
  318.                Conversions into addq/subq
  319.  
  320.             B (Branches)
  321.                Bcc.l(68020) -> Bcc.w -> Bcc.b, jmp/jsr -> bra/bsr
  322.  
  323.             T (Total branch optimization)
  324.                Bcc.l(68020) -> Bcc.w -> Bcc.b (forward branches)
  325.                Only active if 'B' is selected also.
  326.                WARNING! If you use this option together with a
  327.                listing file, then you can't rely on the lines-
  328.                addresses in it.
  329.  
  330.             L (Logical Shifts)
  331.                lsl #1,Dn -> add Dn,Dn
  332.                lsl.w/b #2,Dn -> add Dn,Dn add Dn,Dn
  333.  
  334.             P (PEA/LEA conversion)
  335.                move.l #x,An -> lea x,An
  336.                     -> lea (x,PC),An / lea x.w,An
  337.                move.l #x,-(SP) -> pea x -> pea (x,PC) / pea x.w
  338.  
  339.             S (Special optimizations)
  340.                pea 0 -> clr.l -(SP)
  341.                add/sub #0,An or lea (0,An),An ->  (removed)
  342.                The following are not recommendable for a MC68000
  343.                accessing hardware registers:
  344.                move #0,<ea> -> clr <ea>
  345.                move.b #-1,<ea> -> st <ea>
  346.  
  347.             M (MOVEM)
  348.                movem Rn,<ea> -> move Rn,<ea>
  349.                movem ,<ea> -> (removed)
  350.  
  351.             I (Ignore too large distances)
  352.                Distances, which are currently out of range will
  353.                not cause an error. This is useful for originally
  354.                assembling a reassembler-output or when you are
  355.                sure that all distances will come into range again,
  356.                by optimization of the subsequent code.
  357.                BE CAUTIOUS!!! If a distance has not come into
  358.                range, PhxAss will write faulty code!
  359.  
  360.             There are two short cuts:
  361.    *            Selects all standard optimizations & T (-nnrqbt).
  362.    !            Enables all optimizations possible (-nnrqbtlpsm).
  363.             -n without parameters will forbid any optimizing.
  364.             If -n is not specified the assembler uses standard
  365.             optimization (-nnrqb).
  366.  
  367.  
  368.  
  369. Programmer Information
  370. ======================
  371.  
  372.  
  373. 1. Comments
  374.  
  375. Comments start with a ';' or with a '*'.  The text which follows after the
  376. operand field is also a comment and doesn't need ';' or '*'.
  377. Example:
  378.      ; Comment text
  379.       moveq   #0,d0
  380.      ** This is a comment too **
  381.       nop                  ; comment
  382.       add.l   d0,d0           comment after operand field
  383.  
  384. If no operand field is given, e.g. after the NOP instruction, the comment must
  385. be preceded by a ';'. The example above without a semicolon after the NOP
  386. would make the assembler to treat 'comment' as its operand.
  387. '*' is not allowed as a comment-introducer behind an instruction or directive!
  388.  
  389.  
  390. 2. Labels
  391.  
  392. Labels must start in the first column of a line. The colon after a label is
  393. optional.
  394. Example:
  395.      Label:   moveq   #0,d0
  396.  
  397. Local labels have a '$' suffixed or are preceded by a '.' (since V3.30). They
  398. are only valid between two global labels.
  399. Example:
  400.      Global1: add.w    d0,d1
  401.           beq.s    local1$
  402.           bpl.s    .local2
  403.           rts
  404.      local1$: moveq    #-1,d0
  405.      .local2: rts
  406.      Global2:
  407.  
  408. The length for global and local labels is unlimited. Valid characters for the
  409. labels are: 'a'-'z', 'A'-'Z', '0'-'9' and '_' . The first character may be a
  410. '.' or an '@' (providing the second character is non-numeric). Global labels
  411. cannot start with a digit.
  412.  
  413. The special '*'-symbol always contains the current address. This enables
  414. instructions like: bra *+4
  415. CAUTION! Forward references with '*' will be corrected by PhxAss, but backward
  416. references won't!
  417.  
  418.  
  419. 3. Executable M68000 instructions
  420.  
  421. They have the general format:
  422.      label      operation   operands
  423.  
  424. PhxAss recognizes all operations found in Motorola's M68000PM/AD Programmer's
  425. Reference Manual and all of the common additions and short forms like BHS
  426. instead of BCC, BLO instead of BCS, MOVE instead of MOVEA, ADD instead of
  427. ADDI, etc. . In the current version all MC68000,68010,68020,68030,68040,
  428. 68851,68881 and 68882 instructions are completely supported.
  429. The operand field consists of one to four (68851) operands seperated by a
  430. comma with no imbedded spaces.
  431.  
  432. The extended addressing modes (since 68020) have some ambiguities.
  433. E.g. (0,A0) would be optimized to (A0) (one word), but maybe you want the zero
  434. to be a 32-bit base displacement and you also want a suppressed D7 register.
  435. This instruction would have the same effect when executing, but it consists of
  436. eight words instead of one.
  437. Since PhxAss V3.70 you only have to write (0.L,A0,ZD7).
  438.  
  439. By utilizing Zero-register names (ZRn) and the displacement extensions .W and
  440. .L you should be able to generate any 68020 instruction you want.
  441. A .W/.L extension after the first displacement will tell PhxAss to switch to
  442. base displacement mode and to disable optimizing.
  443. The suppressed registers are represented by the following symbols:
  444. o suppressed data register D0-D7: ZD0-ZD7
  445. o suppressed address register A0-A7: ZA0-ZA7
  446. o suppressed PC: ZPC
  447. It is impossible to EQUR suppressed registers!
  448.  
  449.  
  450. 4. Expressions
  451.  
  452. Expressions consist of symbols and constants. Symbols can be absolute,
  453. relocatable or external. The arithmetic operations supported by PhxAss are
  454. (from highest to lowest precedence) :
  455.  
  456.  ~    not (unary)     -    negation (unary)
  457.  <<   shift left     >>   shift right
  458.  *    multiplication     /    division               //   modulo
  459.  &    and         |    or ('!' also allowed)    ^    exclusive or
  460.  -    subtraction     +    addition
  461.  ( )  parentheses   or [ ]    brackets
  462.  
  463. For absolute symbols and constants (which are absolute too), all arithmetic
  464. operations are allowed.
  465. If relocatables or externals occur in the expression, only subtraction and
  466. addition is possible with some restrictions:
  467.  
  468.    reloc - abs        extern - abs         reloc - reloc
  469.    reloc + abs        extern + abs         abs + reloc      abs + extern
  470.  
  471. are defined, the others are illegal.
  472.  
  473. There are six types of constants:
  474. Hexadecimal, preceded by a '$', consists of '0'-'9' and 'A'-'F' (or 'a'-'f')
  475. Decimal, consists of '0'-'9'
  476. Float, has the format [+/-][integer][.fraction][E[+/-]exponent]
  477. Octal, preceded by a '@', consists of '0'-'7'
  478. Binary, preceded by a '%', consists of '0' and '1'
  479. String, embedded by ' or ", consists of one to four characters.
  480.  
  481. The character '\' is an escape-symbol, which can generate the following codes:
  482.    \\     the '\'-character itself
  483.    \'    character #39 (single quote)
  484.    \"    character #34 (quote)
  485.    \0     character #0  (string terminator)
  486.    \n     character #10 (line feed)
  487.    \f     character #12 (formular feed)
  488.    \b     character #8  (backspace)
  489.    \t     character #9  (tabulator)
  490.    \r     character #13 (carriage return)
  491.    \e     character #27 (escape)
  492.    \c     character #155(control sequence introducer)
  493.  
  494.  
  495. 5. Directives
  496.  
  497. The following paragraphs describe all directives that are supported by the
  498. assembler.
  499.  
  500. EQU
  501.      symbol   equ       <expression>
  502.      symbol   =       <expression>
  503.       The expression will be assigned to the symbol.
  504.  
  505. EQU.x
  506.      symbol   equ.x    <float symbol or constant>
  507.      symbol   =.x       <float symbol or constant>
  508.       An equate with the extension .d,.f,.p,.s,.x or .q will assign the value
  509.       of a floating-point expression to the symbol. No arithmetic operations
  510.       are allowed with floating-point. The expression must be a constant or
  511.       another floating-point symbol.
  512.  
  513. EQUR
  514.      symbol   equr       <register>
  515.       This directive assigns a register (D0-D7,A0-A7 or SP) to the symbol.
  516.       Since V3.00 a register symbol must be declared before it is used.
  517.  
  518. REG
  519.      symbol   reg       <register list>
  520.       This directive assigns the value of the register list to the symbol.
  521.       Valid register lists contain several register names (see EQUR)
  522.       separated by the '/' character. The '-' character defines a range of
  523.       registers. The following are valid register lists:
  524.      a1/a3-a5/d0/d2/d4
  525.      d0-d7/a2-a6
  526.      d1-3/d5-7/a0-1/a3-6  (since V3.56)
  527.  
  528. SET
  529.      symbol   set       <absolute expression>
  530.       This directive assigns the value of the expression to the symbol. No
  531.       relocatables or externals are allowed within the expression. A symbol
  532.       defined by a SET directive may change its value by another SET.
  533.       There are some set-symbols which are defined by PhxAss:
  534.       _PHXASS_      set       1
  535.       _VERSION_   set       version<<16+revision
  536.       According to the connected processor and co-processor PhxAss will set
  537.       _MC68000_, _MC68010_, _MC68020_ and  _MC68881_. The symbols _MC68030_,
  538.       _MC68040, and __MC68882_ will only be created when OS2/3.x is present.
  539.       NARG is zero outside a macro. Within a macro NARG is set to the number
  540.       of specified arguments.
  541.  
  542. RSRESET
  543.       This directive resets the internal RS-counter.
  544.  
  545. RSSET
  546.           rsset    [<count]
  547.       This directive sets the internal RS-counter to the <count> expression.
  548.  
  549. RS
  550.      [symbol] rs.x       [<count>]
  551.       RS assigns the value of the internal RS-counter to the symbol, then it
  552.       increases the counter by the extension size multiplied with <count>. If
  553.       <count> is missing, it defaults to zero. For valid extensions see the
  554.       DC directive.
  555.  
  556. IDNT
  557.           idnt       <name>
  558.       This directive sets the name of the object file unit which the assembler
  559.       will generate. By default, it will be the name of the source file without
  560.       the extension.
  561.  
  562. TTL
  563.       See IDNT.
  564.  
  565. SUBTTL
  566.       subttl will cause no error with PhxAss, but for now it does nothing.
  567.  
  568. COMMENT
  569.           comment  text
  570.       You may write any text you like behind this directive.
  571.  
  572. LIST
  573.       The following source code will be written to the listing file.
  574.  
  575. NOLIST
  576.       The following source code will not be written to the listing file.
  577.  
  578. OPT
  579.           opt       <optimize flags>
  580.       Changes optimization. For a listing of all optimize flags, see "Assembler
  581.       Options".
  582.  
  583. MACRO, ENDM
  584.      symbol   macro
  585.           ...text...
  586.           endm
  587.           macro    symbol
  588.           ...text...
  589.           endm
  590.       This directive assigns a macro to the symbol. The symbol may appear on
  591.       the left or the right side of the directive. The text between the MACRO
  592.       and ENDM directives will be inserted into the source code when the
  593.       assembler discovers the symbol. When calling the macro, up to nine
  594.       arguments, separated by a comma, can be specified in the operand field.
  595.       They are referenced in the macro text as '\1' through '\9'. '\0' is
  596.       reserved for the extension of the macro symbol. Example:
  597.      bhs      macro
  598.           bcc.\0   \1
  599.           endm
  600.       This macro can be called by:    bhs.s     label
  601.       ".s" will be assigned to \0 and "label" will be assigned to \1.
  602.       A "\@" within the macro is replaced by text of the form "nnn", where
  603.       nnn is a unique three-digit number for each macro call. Labels within a
  604.       macro should consist of "\@", because defining labels twice is illegal.
  605.  
  606. MEXIT
  607.       Upon encountering this directive within a macro, the assembler scans for
  608.       the ENDM directive and leaves the macro.
  609.  
  610. END
  611.       In pass one the assembler ignores the rest of the source code and starts
  612.       pass two. In pass two the assembler closes all files and terminates.
  613.       By default the assembler terminates at end of file.
  614.  
  615. FAIL
  616.       The assembler displays the error "69 Assembly aborted !" and terminates.
  617.  
  618. ECHO
  619.           echo       <string>
  620.       The assembler echoes the string. If <string> isn't specified, only a
  621.       newline is echoed.
  622.  
  623. MACHINE
  624.           machine  <processor-number>
  625.       This directive sets the processor-type for which the code will be
  626.       generated. Valid processor-numbers are:
  627.       68000, 68010, 68020, 68030, 68040
  628.  
  629. FPU
  630.           fpu [<cpID>]
  631.       This directive enables code generation for a MC68881/68882 coprocessor.
  632.       By default the <cpID> is set to one, which should be the correct ID for
  633.       most systems using a floating point coprocessor.
  634.       Never set <cpID> to zero, because this is the constant ID for a PMMU.
  635.       If you have set the processor-type to 68040 you should not use this
  636.       directive.
  637.  
  638. PMMU
  639.       This directive enables code generation for a MC68851 Paged Memory
  640.       Management Unit. PMMU only makes sense if you have set the processor-
  641.       type to '68020'.
  642.  
  643. SECTION
  644.           section  <name>[,<type>[,<memflag>]]
  645.       The subsequent code will be placed in the section named <name>. There
  646.       are three section types: CODE, DATA and BSS. CODE contains the executable
  647.       M68000 instructions, DATA contains initialized data and BSS contains un-
  648.       initialized data (set to zero before the program is started). By default
  649.       <type> is set to CODE. The section will be loaded to the memory indicated
  650.       by the <memflag> argument. This can be FAST or CHIP. By default the
  651.       section will be loaded to the memory with the highest priority.
  652.       For compatibility reasons CODE_C, DATA_C and BSS_C are also recognized as
  653.       section type since V3.56.
  654.       Creating a section lets the assembler change into relocatable mode. In
  655.       this mode the following directives are illegal:
  656.       org, load, file, trackdisk
  657.  
  658. CODE, CSEG
  659.       These directives correspond to:  section    "CODE",code
  660.  
  661. DATA, DSEG
  662.       These directives correspond to:  section    "DATA",data
  663.  
  664. CODE_C, CODE_F, DATA_C, DATA_F, BSS_C, BSS_F
  665.       See CODE, DATA or BSS. In addition a memflag will be set, which causes
  666.       the section to be loaded to FAST (xxx_F) or to CHIP (xxx_C).
  667.  
  668. BSS (1)
  669.       This directive corresponds to:   section    "BSS",bss
  670.  
  671. BSS (2)
  672.           bss       symbol,<size>
  673.       BSS with arguments does not start a section. It defines a symbol to be
  674.       in the BSS-section, reserves <size> bytes in this section and assigns
  675.       the address of the first byte to the symbol.
  676.  
  677. GLOBAL
  678.           global   symbol,<size>
  679.       This directive does the same as BSS symbol,<size>. In addition GLOBAL
  680.       will declare the symbol as XDEF (ext_def).
  681.  
  682. OFFSET
  683.           offset   [<start offset>]
  684.       This directive indicates the beginning of a special offset-section. All
  685.       the labels, which are declared in this section, will be treated as
  686.       absolute offsets instead of addresses. <start offset> defaults to zero.
  687.       This might be useful for declaring structure offsets with the DS.x
  688.       directive. While writing programs for PhxAss you should prefer the faster
  689.       RSRESET, RSSET and RS.x directives. OFFSET was mainly implemented for
  690.       compatibility reasons.
  691.  
  692. RORG
  693.           rorg       <section offset>
  694.       This directive defines the offset of the subsequent code relative to the
  695.       start of the current section.
  696.  
  697. INCDIR
  698.           incdir   <path1>[,<path2>,...]
  699.       This directive does the same like the -i option (see Assembler Options).
  700.  
  701. INCLUDE
  702.           include  <filename>
  703.       This directive causes PhxAss to suspend the assembling of the current
  704.       file and to assemble the file named <filename>. When done, the assembler
  705.       continues assembling the original file.
  706.       If PhxAss can't find the include file, it first searches within the
  707.       include directory defined by the environment variable PHXASSINC. Then
  708.       it searches within the include directories defined by INCDIR and the
  709.       -i assembler option (see "Assembler Options").
  710.  
  711. INCBIN
  712.           incbin   <filename>
  713.       This directive causes the assembler to include a binary file into the
  714.       current section (e.g. graphics, samples or trigonometrical tables).
  715.       The assembler searches in the same include directories like INCLUDE.
  716.  
  717. XREF
  718.           xref       symbol1[,symbol2,...]
  719.       This directive tells the assembler that the specified symbols are
  720.       externally defined and will be inserted by the linker.
  721.  
  722. NREF
  723.           nref       symbol1[,symbol2,...]
  724.       This directive does the same like XREF, but the assembler is forced to
  725.       use these symbols as small-data relocatables.
  726.  
  727. XDEF
  728.           xdef       symbol1[,symbol2,...]
  729.       This directive causes the assembler to add the names and values of the
  730.       specified symbols to the external-block of the object file. The linker
  731.       can read the values of these symbols and insert them into other object
  732.       files.
  733.  
  734. PUBLIC
  735.           public   symbol1[,symbol2,...]
  736.       When the specified symbols are defined in the current code, PUBLIC will
  737.       do the same like XDEF. When the symbols are unknown, PUBLIC will do the
  738.       same like XREF.
  739.  
  740. ORG
  741.           org       address
  742.       Defines the origin of the subsequent code and lets the assembler change
  743.       into absolute mode. Since V1.8 several ORG directives are allowed and
  744.       each one can be seen as a new section. The following directives are
  745.       illegal in absolute mode:
  746.       ttl, code, cseg, data, dseg, bss, section, offset, xref, nref, xdef,
  747.       public, idnt.
  748.  
  749. LOAD
  750.           load       address
  751.       After assembling is done, the absolute code will be loaded to this
  752.       address. By default the code will be loaded to the address which was
  753.       specified as origin.
  754.  
  755. FILE
  756.           file       <filename>
  757.       After assembling is done, the absolute code will be written to the file
  758.       named <filename>.
  759.  
  760. TRACKDISK
  761.           trackdisk <drive>,<startblock>[,<offset>]
  762.       After assembling is done, the absolute code will be written directly to
  763.       floppy disk using the 'trackdisk.device'. <drive> is valid from 0 to 3.
  764.       <startblock> is valid from 0 to 1759. <offset>, which is zero by default,
  765.       specifies the byte-offset within a block and is valid from 0 to 511.
  766.  
  767. NEAR
  768.           near       [An[,<secnum> | SmallData]]
  769.       This directive initializes the parameters used by the near-data model.
  770.       NEAR with arguments may appear only once in the whole source code. After
  771.       initializing the small-data model, it can be switched on and off by NEAR
  772.       and FAR without arguments. In this mode you are allowed to access near-
  773.       symbols via 'NearSymbol(An)'. Absolute references will be automatically
  774.       converted to Address Register Indirect, if possible.
  775.       The first argument, the address-register, is valid from A2 to A6 and will
  776.       be A4 by default. <secnum>, which defaults to zero, specifies the number
  777.       of the section which will be accessed by Address Register Indirect mode.
  778.       If <secnum> is -1 or a string starting with 'S' or 's', all Data and Bss
  779.       sections will be treated as near-sections and can be coalesced by the
  780.       linker.
  781.           near       code
  782.       If the argument equals to the string "CODE" the assembler activates the
  783.       small-code model. This will force all absolute XREF jumps into PC-
  784.       relative mode.
  785.  
  786. FAR
  787.       This directive turns off the small-data model when active.
  788.  
  789. INITNEAR
  790.       This directive inserts two M68000 instructions into the code which will
  791.       initialize the small-data model depending on the parameters set by the
  792.       NEAR directive. The assembler will generate this code (10 bytes):
  793.           lea       SmallDataBase,An
  794.           lea       32766(An),An
  795.  
  796. DC
  797.      label      dc.x       <value>[,<value>,...]
  798.      label      dc.b       "string"[,...]
  799.       The DC (Define Constant) directive causes one or more fields of memory
  800.       to be allocated and initialized. Each field has the same size, specified
  801.       by the extension of the directive. Each byte, word or longword <value>
  802.       can be an expression and may contain forward references. For floating-
  803.       point and quadword types only constants are allowed. The following
  804.       extensions are valid:
  805.       .B    (1 byte)    Byte          .W    (2 bytes)   Word
  806.       .L    (4 bytes)    Longword      .F    (4 bytes)   Fast Floating Point
  807.       .S    (4 bytes)    Single Precision  .D    (8 bytes)   Double Precision
  808.       .Q    (8 bytes)    Quadword(V3.42)   .X    (12 bytes)  Ext. Precision
  809.       .P    (12 bytes)    Packed BCD
  810.       If the extension is .B, .W or .L several values can be expressed by a
  811.       string, but when using word- or longword-size the string must be aligned.
  812.  
  813. DCB, BLK
  814.      label      dcb.x    <num>[,<fill>]
  815.      label      blk.x    <num>[,<fill>]
  816.       These directives allocate a block of memory having <num> entries. The
  817.       available entry-sizes are the same like above. The block will be
  818.       initialized with <fill> which is zero when missing.
  819.  
  820. DS
  821.      label      ds.x       <num>
  822.       This directive allocates a block of memory having <num> entries and
  823.       initializes each field with zero. See DCB, BLK.
  824.  
  825. CNOP
  826.           cnop       <offset>,<align>
  827.       This directive aligns the address of the following code to <align>. Then
  828.       the <offset> is added. Example:      cnop    2,4   . This example would
  829.       align the next address two bytes behind the next longword boundary.
  830.  
  831. EVEN
  832.       This directive corresponds to  cnop 0,2  which will make the address
  833.       word-aligned.
  834.  
  835. IFcond, ELSE, ENDIF, ENDC
  836.       These directives support conditional assembling. The general form of the
  837.       IF directive is:
  838.           if<cond>    <expression> or symbol
  839.           ...
  840.           [else
  841.           ...]
  842.           endc (or endif)
  843.       PhxAss supports the following conditions:
  844.      IFC "string1","string2" compares two strings. This is useful within
  845.                  macros, when the strings contain macro-
  846.                  arguments '\x' .
  847.      IFD/IFND symbol     Tests if the symbol is defined (undefined).
  848.      IFEQ/IFNE <exp>     Tests if <exp> is zero (not zero).
  849.      IFGT/IFLT <exp>     Tests if <exp> is greater (less) than zero.
  850.      IFGE/IFLE <exp>     Tests if <exp> is greater (less) than or
  851.                  equal to zero.
  852.  
  853.  
  854. PROCSTART,PROCEND
  855.       These directives are for compatibility with the DICE-C sytem. But cur-
  856.       rently they do nothing. For the future it should be possible to remove
  857.       LINK A5,#0 / UNLK A5  when A5 is not referenced between PROCSTART and
  858.       PROCEND.
  859.  
  860.  
  861.  
  862. Linker
  863. ======
  864.  
  865. You may use any linker which supports the standard Amiga-DOS object file
  866. format. If you want to use the small-data model, you should test how small-data
  867. references (HUNK_DREL16 = $3f8) are interpreted by your linker. They are for
  868. exmaple correctly interpreted by PhxLnk and DLink. BLink (PD and Lattice-C)
  869. displays no error but generates wrong code.
  870.  
  871.  
  872.  
  873. Assembler Errors
  874. ================
  875.  
  876. In the current version of PhxAss the following errors can be generated:
  877.  
  878. 01 Out of memory
  879.  
  880. 02 Only ONE source file can be specified
  881.    Example: phxass file1 file2     -> Error 02
  882.  
  883. 03 Listing file option was declared twice
  884.  
  885. 04 Need source file for this option
  886.    Example: phxass -e srcfile    or   phxass -l srcfile     -> Error 04
  887.         phxass srcfile -e    -> ok
  888.  
  889. 05 Equates file option was declared twice
  890.  
  891. 06 Need file name after -o option
  892.  
  893. 07 Need file name after -h option
  894.  
  895. 08 Need directory name after -i option
  896.  
  897. 09 Illegal model. Use F for far or N[2-6][,SecNum] for near
  898.  
  899. 10 Illegal base register for the near-mode
  900.    Valid base registers are: A2-A6
  901.  
  902. 11 Missing source file name
  903.  
  904. 12 File doesn't exist
  905.  
  906. 13 Missing include file name
  907.  
  908. 14 Read error
  909.  
  910. 15 String buffer overflow
  911.    Source code lines are limited to 79 characters.
  912.  
  913. 16 Too many sections
  914.    Maximum is 255 sections.
  915.  
  916. 17 Symbol can't be declared as external
  917.    XDEF can only be used with absolute or relocatable symbols.
  918.  
  919. 18 Symbol was declared twice
  920.  
  921. 19 Unable to declare XREF-symbol
  922.    A symbol, which is defined in the current source code, can't be an external.
  923.  
  924. 20 Illegal opcode extension
  925.    Legal: .b .w .l .s .f .d .x .p .q
  926.  
  927. 21 Illegal macro parameter
  928.    Possible parameters are: \0 (opcode extension), \1 - \9 and \@
  929.  
  930. 22 Illegal characters in label
  931.    See Labels chapter in Programmer Information.
  932.  
  933. 23 Unknown directive
  934.    The opcode is neither a 680x0-mnemonic nor an assembler directive or macro.
  935.  
  936. 24 Too many parameters for a macro
  937.    Nine parameters ( \1 to \9 ) are possible.
  938.  
  939. 25 Can't open trackdisk.device
  940.  
  941. 26 Argument buffer overflow
  942.    Arguments are limited to 79 chracters.
  943.  
  944. 27 Bad register list
  945.    Valid register lists: d0-d3    d3-d4/a2  d2/d3/a4-a6  d7  a0/d2  d2-6/a0-4
  946.  
  947. 28 Missing label
  948.    This directive requires a label.
  949.  
  950. 29 Illegal seperator for a register list
  951.    Valid seperators are '-' and '/'.
  952.  
  953. 30 SET, MACRO, XDEF, XREF and PUBLIC are illegal for a local symbol
  954.  
  955. 31 Not a register (try d0-d7 or a0-a7 or sp)
  956.  
  957. 32 Too many ')'
  958.  
  959. 33 Unknown addressing mode
  960.    See Motorola's "8-/16-/32-bit Microprocessor User's Manual" for a
  961.    description of all addressing modes.
  962.  
  963. 34 Addressing mode not supported
  964.    Example:   move.b  d0,a1  /    move  usp,d2  /  clr.w    (d3)+    -> Error 34
  965.  
  966. 35 Can't use macro in operand
  967.    Macros must be used as opcodes.
  968.  
  969. 36 Undefined symbol
  970.  
  971. 37 Missing register
  972.    Example:   mulu   d0,   -> Error 37
  973.  
  974. 38 Need data-register
  975.  
  976. 39 Need address-register
  977.  
  978. 40 Word at odd address
  979.    Example:   dc.b "Hallo"
  980.           dc.w 0        -> Error 40
  981.    Insert CNOP 0,2 or EVEN after string-constants.
  982.  
  983. 41 Syntax error in operand
  984.  
  985. 42 Relocatability error
  986.    Example:   move.l  label(pc),d0  , where label is not a reloc. and/or label
  987.    is not defined in the current section  -> Error 42
  988.  
  989. 43 Too large distance
  990.    Example:   move.w  50000(a0),d0   -> Error 43
  991.    Too large distance for a displacement by indirect addressing or branch.
  992.    Short branches have a range of +126/-128 bytes. Long branches have a range
  993.    of +32766/-32768 bytes.
  994.  
  995. 44 Displacement expected
  996.    Example:   label: move.l  label(a2),d1   -> Error 44
  997.  
  998. 45 Valid address expected
  999.    A program-address was expected.
  1000.  
  1001. 46 Missing argument
  1002.  
  1003. 47 Need numeric symbol
  1004.  
  1005. 48 Displacement outside of section
  1006.    Example:   bra  label   , where label is not defined in the current section
  1007.    -> Error 48
  1008.  
  1009. 49 Only one distance allowed
  1010.    Expression can't contain several distances.
  1011.    Example:   move.l  #[label1-label2]+[label3-label4],d0   -> Error 49
  1012.  
  1013. 50 Missing bracket/parenthesis
  1014.  
  1015. 51 Expression stack overflow
  1016.    A maximum of 128 arguments are allowed in one expression.
  1017.  
  1018. 52 Unable to negate an address
  1019. 53 Can't use distance and reloc in the same expression
  1020. 54 Can't shift an address
  1021. 55 Can't multiply an address
  1022. 56 Overflow during multiplication
  1023. 57 Can't divide an address
  1024. 58 Division by zero
  1025. 59 No logical operation allowed on addresses
  1026. 60 Need two addresses to make a distance
  1027. 61 Unable to sum addresses
  1028.  
  1029. 62 Write error
  1030.  
  1031. 63 Alignment error
  1032.    Example:   dc.l "XYZ"   -> Error 63
  1033.  
  1034. 64 Can't subtract a XREF
  1035.    Valid operations with externals:  ext + abs ,  abs + ext   and   ext - abs
  1036.  
  1037. 65 Impossible in absolute mode
  1038.    These directive can't be used in absolute mode:
  1039.    ttl, code, cseg, data, dseg, bss, section, xref, nref, xdef, public
  1040.  
  1041. 66 Unknown error (fatal program failure)
  1042.    The assembler or its memory was corrupted by a faulty program running at
  1043.    the same time.
  1044.  
  1045. 67 No externals in absolute mode
  1046.    See 65.
  1047.  
  1048. 68 Out of range
  1049.    Example:   addq.l  #9,d1   -> Error 68
  1050.  
  1051. 69 Assembly aborted
  1052.    Generated by the FAIL directive.
  1053.  
  1054. 70 Missing ENDC/ENDIF
  1055.  
  1056. 71 Missing macro name
  1057.  
  1058. 72 Missing ENDM
  1059.  
  1060. 73 Can't define macro within a macro
  1061.  
  1062. 74 Unexpected ENDM
  1063.  
  1064. 75 Unexpected ENDC/ENDIF
  1065.  
  1066. 76 Impossible in relative mode
  1067.    These directive can't be used in relative mode: org, file, load, trackdisk.
  1068.  
  1069. 77 Parameter buffer overflow
  1070.    Parameters are limited to 79 characters.
  1071.  
  1072. 78 Can't open timer.device
  1073.  
  1074. 79 Unable to create file
  1075.    Maybe the destination disk is write-protected.
  1076.  
  1077. 80 Need listing file to add references
  1078.    -x option was specified without the -l option.
  1079.  
  1080. 81 No address allowed here
  1081.    Example:   ds.l label   -> Error 81
  1082.  
  1083. 82 Illegal characters in symbol
  1084.    See error 22.
  1085.  
  1086. 83 Source code too large (max. 65535 lines)
  1087.  
  1088. 84 No floating point without mathieeedoubbas.library
  1089.    To use floating point symbols, you must have the mathieeedoubbas.library
  1090.    in your LIBS: directory.
  1091.  
  1092. 85 IEEE Double Precision Overflow/Underflow
  1093. 86 IEEE Single Precision Overflow/Underflow
  1094. 87 Motorola FFP Overflow/Underflow
  1095. 88 Incompatible float types
  1096. 89 Packed BCD Overflow/Underflow
  1097.  
  1098. 90 Can't mix LOAD, FILE and TRACKDISK
  1099.    Example:   load $70000
  1100.           file "mycode"   -> Error 90
  1101.  
  1102. 91 Near mode not activated
  1103.    The near mode must be activated first, before using the INITNEAR directive.
  1104.  
  1105. 92 Instruction not implemented in your machine
  1106.    The instruction exists for another processor, but not for your one. Use
  1107.    MACHINE to change processor type.
  1108.  
  1109. 93 Illegal scale factor
  1110.    Example:    move.w  (a1,d2*3)    -> Error 93
  1111.    Valid scale factors are:  1, 2, 4 and 8
  1112.  
  1113. 94 Missing operand
  1114.    Example:    move.l  (a0)+        -> Error 94
  1115.  
  1116. 95 Section doesn't exist
  1117.    This error is caused by specifying an illegal section number in the NEAR
  1118.    directive.
  1119.  
  1120. 96 Illegal RORG offset
  1121.    The relative offset must not specify an address before the actual PC.
  1122.  
  1123.  
  1124.  
  1125. History
  1126. =======
  1127.  
  1128. After six years of working with assemblers like SEKA, AS (Aztec-C) and A68k,
  1129. I decided in December 1991 that I need a new, powerful assembler. First, I had
  1130. the idea to buy O.M.A. or Devpac, but I don't like these modern assemblers with
  1131. an integrated editor. Other reasons for starting the development of PhxAss were
  1132. the chronic lack of money (I'm student) and the possibility to create an
  1133. assembler which will satisfy all of my demands.
  1134. I completed the first version V1.00 at the 28th of January in 1992. From now
  1135. on I used PhxAss to assemble itself (first I used A68k). It took me more than
  1136. a year and 23 versions to reach V3.00 (PhxAss was not my only project in this
  1137. period).
  1138.  
  1139. Here is a list of my hardware and literature that enabled the development of
  1140. PhxAss:
  1141. Hardware:   My good old A1000 (first version from '85) with 68010 CPU,
  1142.         2 MB Fast-RAM and a 33 MB Harddisk.
  1143.  
  1144. Literature: Motorola MC68000/68008/68010/68HC000 8-/16-/32-Bit Microprocessor
  1145.         User's Manual (Prentice Hall)
  1146.  
  1147.         Motorola MC68020 32-Bit Microprocessor User's Manual (Prentice
  1148.         Hall)
  1149.  
  1150.         Motorola MC68881/882 Floating-Point Coprocessor User's Manual
  1151.         (Prentice Hall)
  1152.  
  1153.         Motorola MC68851 Paged Memory Management Unit User's Manual
  1154.         (Prentice Hall)
  1155.  
  1156.         Motorola M68000,MC68020,MC68020,MC68040,MC68851,MC68881/882
  1157.         Programmer's Reference Manual (Prentice Hall)
  1158.  
  1159.         Amiga ROM Kernel Reference Manual: Libraries & Devices (Addison-
  1160.         Wesley)
  1161.  
  1162.         Amiga ROM Kernel Reference Manual: Includes & Autodocs (Addison-
  1163.         Wesley)
  1164.  
  1165.         Amiga Intern (Data Becker)
  1166.  
  1167.         Amiga Intern Band 2 (Data Becker)
  1168.  
  1169.  
  1170.  
  1171. Bugs
  1172. ====
  1173.  
  1174. Known bugs in version V3.71:
  1175.  
  1176. o Floating-point symbols defined by the EQU.x directive do not appear in the
  1177.   equates file.
  1178. o When the instruction xxxx is removed by optimization, PhxAss generates an
  1179.   illegal short branch with zero displacement.
  1180.       Bcc.s  label
  1181.       xxxx
  1182.     label:
  1183.   This can only happen when you have set the optimize flag 'M' and xxxx is a
  1184.   MOVEM without registers or when you have set the 'S'-flag and xxxx is a
  1185.   'ADDA/SUBA #0,An' or 'LEA 0(An),An'.
  1186. o The Forward-Branch optimization (T-flag) doesn't change the line-addresses
  1187.   in the listing file.
  1188. o The following lines from the orignial Commodore include file "exec/types.i"
  1189.   can't be assembled and must be changed:
  1190.   \@BITDEF  SET     1<<\3
  1191.         BITDEF0 \1,\2,F_,\@BITDEF
  1192.   change to:
  1193.   BITDEF\@  SET     1<<\3
  1194.         BITDEF0 \1,\2,F_,BITDEF\@
  1195.  
  1196.  
  1197. USERS OF 32-BIT PROCESSORS AND COPROCESSORS:
  1198. Please try to test all specific instructions of your processor and send me
  1199. your bug-reports. In return you will get the newest version.
  1200.  
  1201.  
  1202. If any bugs or questions occur, please write to :
  1203.  
  1204.             Frank Wille
  1205.             Auf dem Dreische 45
  1206.             32049 Herford
  1207.             GERMANY
  1208.  
  1209.            __
  1210.           ///
  1211.          ///
  1212.         ///
  1213.    __       ///
  1214.    \\\      ///
  1215.     \\\  ///
  1216.      \\\///
  1217.       \XX/      A M I G A   F O R E V E R  !
  1218.  
  1219.